"use strict";

module.exports = core;
const path = require("path");
const semver = require("semver");
const constant = require("./const");
const colors = require("colors/safe");
const pkg = require("../package.json");
const log = require("@dbc-dev/log");
const init = require("@dbc-dev/init");
const exec = require("@dbc-dev/exec");
const commander = require("commander");
const program = new commander.Command();
let args;
//checkInputArgs();

const userHome = require("user-home");
const { register } = require("module");
const pathExists = require("path-exists").sync;

async function core() {
  try {
    await prepare();
    registerCommand();
  } catch (e) {
    log.error(e.message);
    if (program.debug) {
      console.log(e);
    }
  }
}
async function prepare() {
  checkPkgVersion();
  //checkNodeVersion();
  checkRoot();
  checkUserHome();
  //checkInputArgs();
  checkEnv();
  await checkGlobalUpdate();
}
function registerCommand() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage("<command> [options]")
    .version(pkg.version)
    .option("-d, --debug", "是否开启调试模式", false)
    .option("-tp, --targetPath <targetPath>", "是否指定本地调试文件路径", "");
  program
    .command("init [projectName]")
    .option("-f, --force", "是否强制初始化项目")
    .action(exec);
  program.on("option:debug", () => {
    if (program.debug) {
      process.env.LOG_LEVEL = "verbose";
    } else {
      process.env.LOG_LEVEL = "info";
    }
    log.level = process.env.LOG_LEVEL;
  });

  program.on("option:targetPath", function () {
    process.env.CLI_TARGET_PATH = program._optionValues.targetPath;
  });
  program.on("command:*", (obj) => {
    const availableCommand = program.commands.map((cmd) => cmd.name());
    console.log(colors.red("未知的命令" + obj[0]));
    if (availableCommand.length > 0) {
      console.log(colors.red("可用命令" + availableCommand.join(",")));
    }
  });

  program.parse(process.argv);
  if (program.args && program.args.length < 1) {
    program.outputHelp();
    console.log("");
  }
}
function checkGlobalUpdate() {
  //获取当前版本号和模块名
}
//检查环境变量
function checkEnv() {
  const dotenv = require("dotenv");
  const dotenvPath = path.resolve(userHome, ".env");
  if (pathExists(dotenvPath)) {
    dotenv.config({
      path: dotenvPath,
    });
  } else {
  }
  createDefaultConfig();
}

function createDefaultConfig() {
  const cliConfig = {
    home: userHome,
  };
  if (process.env.CLI_HOME) {
    cliConfig["cliHome"] = path.join(userHome, process.env.CLI_HOME);
  } else {
    cliConfig["cliHome"] = path.join(userHome, constant.DEFAULT_CLI_HOME);
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome;
}
//二期不需要
// function checkInputArgs() {
//   const mimimist = require("minimist");
//   args = mimimist(process.argv.slice(2));
//   checkArgs();
// }
// function checkArgs() {
//   if (args.debug) {
//     process.env.LOG_LEVEL = "verbose";
//   } else {
//     process.env.LOG_LEVEL = "info";
//   }
//   log.level = process.env.LOG_LEVEL;
// }
function checkPkgVersion() {
  //log.info("cli", pkg.version);
}
function checkNodeVersion() {
  const currentVersion = process.version;
  const lowestVersion = constant.LOWEST_NODE_VERSION;
  if (!semver.gte(currentVersion, lowestVersion)) {
    throw new Error(
      colors.red(`imooc-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`)
    );
  }
}

function checkUserHome() {
  if (!userHome || !pathExists(userHome)) {
    throw new Error(colors.red("用户主目录不存在"));
  }
}

function checkRoot() {
  const rootCheck = require("root-check");
  rootCheck();
}
